//
//  LXJOAuthViewModel.swift
//  XJWeiBo
//
//  Created by 李旭杰 on 2017/3/29.
//  Copyright © 2017年 李旭杰. All rights reserved.
//

import UIKit

/// 授权登录页的 ViewModel
class LXJOAuthViewModel: NSObject {
    // MARK: 单例全局访问点
    static var sharedOAuthViewModel: LXJOAuthViewModel = {
        let viewModel = LXJOAuthViewModel()
        /// 沙盒中读取用户信息
        viewModel.userAccount = LXJUserAccountModel.readUserInfoFromDocument()
        return viewModel
    }()
    
    /// 模型对象属性
    var userAccount: LXJUserAccountModel?
    
    /// 判断令牌是否过期(计算属性)
    var accessToken: String? {
        /// 比较令牌的有效期和当前时间的大小
        if userAccount?.expiresDate?.compare(Date()) == ComparisonResult.orderedDescending{
            return userAccount?.access_token
        }
        return nil
    }
    
    /// 封装登录状态
    var isLogin: Bool {
        return accessToken != nil
    }
    
    
    
    // MARK: 获取授权过的Access Token的网络请求
    func requestAccessToken(code: String, success: ((Bool) -> ())?){
        LXJNetworkManager.sharedManager.requestDataForAccessToken(code: code) { (response, error) in
            /// 数据请求失败
            if error != nil{
                print("Access Token的网络请求失败,错误信息为\(error!)")
                /// 执行回调闭包
                success!(false)
                return
            }
            
            /// 执行到此数据请求成功
            guard let dic = response as? [String: Any] else{
                print("Access Token的网络请求返回的数据格式有误")
                /// 执行回调闭包
                success!(false)
                return
            }
            
            /// 转成用户的模型对象
            let userAccount = LXJUserAccountModel.init(dic: dic)
            
            /// 获取用户信息
            self.requestUserInfo(userAccount: userAccount, success: success)
        }
    }
    
    // MARK: 获取用户信息
    fileprivate func requestUserInfo(userAccount: LXJUserAccountModel, success: ((Bool) -> ())?){
        LXJNetworkManager.sharedManager.requestDataForUserInfo(access_token: userAccount.access_token!, uid: userAccount.uid) { (response, error) in
            /// 数据请求失败
            if error != nil{
                print("Access Token的网络请求失败,错误信息为\(error!)")
                /// 执行回调闭包
                success!(false)
                return
            }
            
            /// 执行到此数据请求成功
            guard let dic = response as? [String: Any] else{
                print("获取用户信息后返回的数据格式有误")
                /// 执行回调闭包
                success!(false)
                return
            }
            
            /// 给用户模型进行赋值
            userAccount.name = dic["name"] as? String
            userAccount.avatar_large = dic["avatar_large"] as? String
            
            /// 用户信息归档
            userAccount.saveUserInfoToDocument()
            
            /// 给账号属性进行赋值
            self.userAccount = userAccount
            
            /// 执行回调闭包
            success!(true)
        }
    }
    
}
